/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package chat;

import conection.Servidor;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author javi
 */
public class Chat extends Thread {

    private HashMap<String, Socket> clientesConectados;
    private Socket unCliente;
    private DataInputStream entradaChat;
    private DataOutputStream salidaChat,salidaRestoClientes;
    private boolean sigueChateando;
    private final String nombreCliente;
    private Collection<Socket> socketsActivos;
    private Iterator it;
    private Socket[] clientesANotificar;
    private Servidor servidor;

    public Chat(HashMap<String, Socket> clientesConectados, Socket unCliente, String nombreCliente, Servidor servidor) {
        this.clientesConectados = clientesConectados;
        this.unCliente = unCliente;
        this.sigueChateando = true;
        this.nombreCliente = nombreCliente;
        this.servidor=servidor;
    }

    public void chateando() throws IOException {
        entradaChat = new DataInputStream(unCliente.getInputStream());
        salidaChat = new DataOutputStream(unCliente.getOutputStream());
        String mensaje;
        while (sigueChateando) {
            mensaje = entradaChat.readUTF();
            if (mensaje.equals("exit")) {
                sigueChateando = false;
                servidor.desconectarCliente(nombreCliente);
            } else {
                System.out.println("Recibido mensaje: " + mensaje);
                notificaRestoClientes(mensaje);
            }
        }
    }

    public void notificaRestoClientes(String mensajeAEnviar) throws IOException {
        clientesANotificar = getClientesConectados();
        for (Socket cliente : clientesANotificar) {
            salidaRestoClientes = new DataOutputStream(cliente.getOutputStream());
            salidaRestoClientes.writeUTF(nombreCliente+"|"+mensajeAEnviar);
            salidaRestoClientes.flush();
        }
    }

    public synchronized Socket[] getClientesConectados() {
        Collection<Socket> values = this.clientesConectados.values();
        return values.toArray(new Socket[values.size()]);
    }

    @Override
    public void run() {
        try {
            chateando();
        } catch (IOException ex) {
            Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
